package com.javasm.proxy;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 代理模式的定义：代理模式给某一个对象提供一个代理对象，并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
 * 代理模式分为静态代理与动态代理两种实现
 * 应用目的：一个对象中的某一个或多个方法不满足需求，需要扩展该对象的时候，在不修改源代码的情况下，去扩展对象中的方法。
 *比如原生Connection对象的close方法进行连接关闭，如果引入了连接池对象，放入连接池对象中的Connection对象的close方法不能进行关闭，需要扩展close方法，把对象放回连接池。
 * 代理模式实现数据库连接
 *
 * @remark:
 */
public class TestProxy {
    public static void main(String[] args) throws Exception {
        SmDataSource ds = new SmDataSource();
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/704A");
        ds.setUsername("root");
        ds.setPassword("root");
        ds.setInitSize(10);
        ds.init(); //静态代理
//        ds.init2();//动态代理
        System.out.println("池子大小:"+ds.getSize());//当前获取数据库连接前的连接池可以连接数量

        Connection conn = ds.getConnection();

        PreparedStatement pst = conn.prepareStatement("select * from sys_user where id=?");
        pst.setInt(1,1);
        ResultSet resultSet = pst.executeQuery();
        resultSet.next();
        String uname = resultSet.getString("uname");
        System.out.println(uname);

        conn.close();//执行完数据库连接后，关闭数据库的连接

        System.out.println("池子大小:"+ds.getSize());//执行完数据库连接后，连接池可以连接数量
    }
}
